/**
 * 合并两个有序数组
 * @param {number[]} nums1 第一个有序数组
 * @param {number[]} nums2 第二个有序数组
 * @return {number[]} 合并后的有序数组
 */

// 方法一：双指针法
function mergeSortedArrays(nums1, nums2) {
  const res = [];
  let i = 0;  
  let j = 0;  
  while (i < nums1.length && j < nums2.length) {
    if (nums1[i] <= nums2[j]) {
      res.push(nums1[i++]);
    } else {
      res.push(nums2[j++]);
    }
  }
  while (i < nums1.length) res.push(nums1[i++]);
  while (j < nums2.length) res.push(nums2[j++]);
  return res;
}

// 方法二：合并后排序（简单但不高效）
function mergeSortedArraysSimple(nums1, nums2) {
  return [...nums1, ...nums2].sort((a, b) => a - b);
}

// 方法三：原地合并（假设nums1有足够空间容纳nums2）
function mergeInPlace(nums1, m, nums2, n) {
  let i = m - 1; 
  let j = n - 1; 
  let k = m + n - 1; 
  while (i >= 0 && j >= 0) { // 从后向前比较，将较大的元素放在nums1的末尾
    if (nums1[i] > nums2[j]) {
      nums1[k--] = nums1[i--];
    } else {
      nums1[k--] = nums2[j--];
    }
  }
  while (j >= 0) nums1[k--] = nums2[j--];
  return nums1;
}

// 测试
const arr1 = [1, 3, 5, 7];
const arr2 = [2, 4, 6, 8, 10];
console.log("方法一结果:", mergeSortedArrays(arr1, arr2)); // [1, 2, 3, 4, 5, 6, 7, 8, 10]

const arr3 = [1, 3, 5, 7];
const arr4 = [2, 4, 6, 8, 10];
console.log("方法二结果:", mergeSortedArraysSimple(arr3, arr4)); // [1, 2, 3, 4, 5, 6, 7, 8, 10]

const arr5 = [1, 3, 5, 7, 0, 0, 0, 0, 0];
const arr6 = [2, 4, 6, 8, 10];
console.log("方法三结果:", mergeInPlace(arr5, 4, arr6, 5)); // [1, 2, 3, 4, 5, 6, 7, 8, 10] 